
import axios from 'axios';
import router from '@/router'
import { ElMessage, ElLoading } from 'element-plus';
import Qs from 'qs';
let loadingInstance: any
const baseURL ='/test'
// // 操作正常Code数组
// const codeVerificationArray = isArray(successCode)
//   ? [...successCode]
//   : [...[successCode]]
// 需要加loading层的请求，防止重复提交
const debounce= ['update', 'save']
// 配后端数据的接收方式application/json;charset=UTF-8 或 application/x-www-form-urlencoded;charset=UTF-8
const contentType= 'application/json;charset=UTF-8'
// 最长请求时间
const requestTimeout=10000
// 操作正常code，支持String、Array、int多种类型
const successCode=[1]
// 数据状态的字段名称
const statusName= 'code'
// 状态信息的字段名称
const  messageName= 'msg'
const CODE_MESSAGE: any = {
  200: '服务器成功返回请求数据',
  201: '新建或修改数据成功',
  202: '一个请求已经进入后台排队(异步任务)',
  204: '删除数据成功',
  400: '发出信息有误',
  401: '用户没有权限(令牌失效、用户名、密码错误、登录过期)',
  402: '令牌过期',
  403: '用户得到授权，但是访问是被禁止的',
  404: '访问资源不存在',
  406: '请求格式不可得',
  410: '请求资源被永久删除，且不会被看到',
  500: '服务器发生错误',
  502: '服务启动中',
  503: '服务不可用，服务器暂时过载或维护',
  504: '服务超时',
}

/**
 * axios请求拦截器配置
 * @param config
 * @returns {any}
 */
const requestConf: any = (config: any) => {

  if (
    config.data &&
    config.headers['Content-Type'] ===
      'application/x-www-form-urlencoded;charset=UTF-8'
  )
    config.data = Qs.stringify(config.data)
  if (debounce.some((item) => config.url.includes(item)))
    loadingInstance = ElLoading.service({
      text: '拼命加载中，请稍后...',
      background: 'rgba(0, 0, 0, 0.7)',
      spinner: 'el-icon-loading',
    });
  return config
}

/**
 * axios响应拦截器
 * @param config 请求配置
 * @param data response数据
 * @param status HTTP status
 * @param statusText HTTP status text
 * @returns {Promise<*|*>}
 */
const handleData = async ({ data, status, statusText }: any) => {
  if (loadingInstance) loadingInstance.close()
  // 若data.code存在，覆盖默认code
  const code = data && data[statusName] >= 0 ? data[statusName] : status
  // 若code属于操作正常code，则status修改为200
  // if (codeVerificationArray.indexOf(data[statusName]) + 1) code = 200
  switch (code) {
    case 1:
      // 业务层级错误处理，以下是假定restful有一套统一输出格式(指不管成功与否都有相应的数据格式)情况下进行处理
      // 例如响应内容：
      // 错误内容：{ code: 1, msg: '非法参数' }
      // 正确内容：{ code: 200, data: {  }, msg: '操作正常' }
      // return data
      return data
    case 2:
      return data
    case 3:
      return data
    case 0:
      ElMessage.error(data.msg)
      // break
      return data
    case 996:
      ElMessage.warning(data.msg)
      // break
      return data
    case 999:

      break
    case 401:
      break
    case 402:
      // return await tryRefreshToken(config)
      break
    case 403:
      router.push({ path: '/403' }).then(() => {})
      break
  }
  // 异常处理
  // 若data.msg存在，覆盖默认提醒消息
  const errMsg = `${
    data && data[messageName]
      ? data[messageName]
      : CODE_MESSAGE[code]
      ? CODE_MESSAGE[code]
      : statusText
  }`
  // 是否显示高亮错误(与errorHandler钩子触发逻辑一致)
  ElMessage.error(errMsg)
  return Promise.reject(data)
}

/**
 * @description axios初始化
 */
const instance = axios.create({
  baseURL,
  timeout: requestTimeout,
  headers: {
    'Content-Type': contentType,
  },
})

/**
 * @description axios请求拦截器
 */
instance.interceptors.request.use(requestConf, (error) => {
  return Promise.reject(error)
})

/**
 * @description axios响应拦截器
 */
instance.interceptors.response.use(
  (response) => handleData(response),
  (error) => {
    const { response } = error
    if (response === undefined) {
      if (loadingInstance) loadingInstance.close()
      ElMessage.error(
       {
        message: '连接后台接口失败，可能由以下原因造成：后端不支持跨域CORS、接口地址不存在、请求超时等，请联系管理员排查后端接口问题 ',
        duration: 5 * 1000,
       }
      )
      return {}
    } else return handleData(response)
  }
)

export default instance
